package com.mfcxy.tools;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Component;

/**
 * 反射验证对象的成员属性是否是空值
 * @author mfcxy
 *
 */
@Component
public class CheckClassAttributes {
	
	/**
	 * 检查对象的成员属性是否有值
	 * @param obj
	 * @return
	 */
	public int check(Object obj) {
		//记录变量成员数据
		int attrCount = 0;
		//如果对象是null 直接返回不做反射检查
		if(obj == null) {
			return  attrCount;
		}
		
		Field[] fields = obj.getClass().getDeclaredFields();
		for (int i = 0, len = fields.length; i < len; i++) {
			// 对于每个属性，获取属性名
			String varName = fields[i].getName();
			try {
				// 获取原来的访问控制权限
				boolean accessFlag = fields[i].isAccessible();
				// 修改访问控制权限
				fields[i].setAccessible(true);
				// 获取在对象f中属性fields[i]对应的对象中的变量
				Object o;
				try {
					o = fields[i].get(obj);
					if(o != null && !o.equals("")) {
						attrCount++;
					}
					System.err.println("传入的对象中包含一个如下的变量：" + varName + " = " + o);
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				// 恢复访问控制权限
				fields[i].setAccessible(accessFlag);
			} catch (IllegalArgumentException ex) {
				ex.printStackTrace();
			}
		}
		//System.out.println(attrCount);
		return attrCount;
	}
	
	/**
	 * 通过反射取得对象的值
	 * @param obj
	 * @return
	 */
	public Map<String, Object> getObjVal(Object obj) {
		Map<String, Object> map = new HashMap<>();
		//如果对象是空
		if(obj == null) {
			return map;
		}
		
		Field[] fields = obj.getClass().getDeclaredFields();
		for (int i = 0, len = fields.length; i < len; i++) {
			// 对于每个属性，获取属性名
			String varName = fields[i].getName();
			try {
				// 获取原来的访问控制权限
				boolean accessFlag = fields[i].isAccessible();
				// 修改访问控制权限
				fields[i].setAccessible(true);
				// 获取在对象f中属性fields[i]对应的对象中的变量
				Object o;
				try {
					o = fields[i].get(obj);
					if(o != null) {
						map.put(varName, o);
					}
					System.err.println("传入的对象中包含一个如下的变量：" + varName + " = " + o);
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				// 恢复访问控制权限
				fields[i].setAccessible(accessFlag);
			} catch (IllegalArgumentException ex) {
				ex.printStackTrace();
			}
		}
		
		return map;
	}
}
